剔除和深度测试(Culling & Depth Testing)

背面剔除:剔除是一种优化,不渲染背对观众的多边形。

  语法 :


  1. Cull

    Cull Back | Front | Off

  控制多边形应该剔除(不绘制)的面。


  2. ZWrite

    ZWrite On | Off

  控制像素从这个对象是否写入深度缓冲(默认)。如果你drawng固体物质,离开这。如果你要画半透明效果,切换到ZWrite。

    2.1 ZTest

        ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

  如何进行深度测试。LEqual(默认是绘制对象或在距离为现有对象;隐藏在他们身后的物体)。

    2.2 Offset

        offset Factor, Units

  允许您指定两个参数的深度偏移量。因素和单位。因子缩放Z的最大斜率,相对于X或Y的多边形,和单位规模的可分辨的最小深度缓冲值。这允许你强制一个多边形被绘制在另一个,虽然他们实际上是在同一位置。例如偏移0,1拉的多边形更接近相机忽略了多边形的斜率,而偏移量的1,1将拉的多边形更接近时,看着一个掠角。


示例

  这个对象只渲染对象的背面:

    Shader "Show Insides"
    {
        SubShader
        {
            Pass
            {
                Material
                {
                    Diffuse (1,1,1,1)
                }
                Lighting On
                Cull Front
            }
        }
    }

试着把它应用到一个立方体,并注意绕它旋转的时候感觉都错了。这是因为你只看到立方体的内部零件。


  3. 使用深度写的半透明材质

  通常半透明阴影不写进深度缓冲。然而,这会造成绘制顺序问题,尤其是在复杂的非凸网格。如果你想淡入和淡出网格,然后使用材质填充深度缓冲之前呈现透明可能是有用的。

  半透明对象

  左:标准 Transparent/Diffuse

  右:写入深度缓冲

    Shader "Transparent/DiffuseZwrite"    
    {        
        Properties         
        {            
            _MainTex ("MainTex(RGB)", 2D) = "white" {}                            
            _Color ("Color", Color) = (1,1,1,1)        
        }         
        SubShader        
        {            
            Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="true" }            
            LOD 200             
            Pass             
            {                
                ZWrite On     // 开启深度缓冲写                            
                ColorMask 0   // 关闭所有渲染染色通道            
            }             
            UsePass "Transparent/Diffuse/FORWARD"        
        }         
        FallBack "Transparent/VertexLit"
}

  4. 法线调试

  物体背面显示亮紫色

    Shader "Reveal BackfaceTest" 
    { 
        Properties 
        { 
            _MainTex ("Texture", 2D) = "white" {} 
        } 
        SubShader 
        {  
            Pass 
            { 
                Material  
                { 
                    Diffuse (1,1,1,1) 
                } 
                Lighting On 
                SetTexture [_MainTex] 
                { 
                    Combine Primary * Texture DOUBLE 
                } 
            }  
            Pass  
            { 
                Color (1, 0, 1, 1) 
                Cull Front
            } 
        } 
    }

  5. 玻璃剔除

    Shader "Simple Glass" 
    { 
        Properties 
        { 
            _MainTex ("Texture", 2D) = "white" {} 
            _Color ("Main Color", Color) = (1,1,1,0) 
            _SpecColor ("Spce Color", Color) = (1,1,1,1) 
            _Shininess ("Shininess", Range(0.01, 1)) = 0.7 
            _Emission ("Emission Color", Color) = (0,0,0,0)  
        }  
        SubShader 
        { 
            Material 
            { 
                Diffuse [_Color] 
                Ambient [_Color] 
                Shininess [_Shininess] 
                Specular [_SpecColor] 
                Emission [_Emission] 
            } 
            Lighting On 
            SeparateSpecular On  
            Blend SrcAlpha OneMinusSrcAlpha  
            Pass  
            { 
                Cull Front 
                SetTexture [_MainTex] 
                { 
                    Combine Primary * Texture 
                } 
            }  
            Pass 
            { 
                Cull Back 
                SetTexture [_MainTex] 
                { 
                    Combine Primary * Texture 
                } 
            } 
        } 
    }

🔚